package com.tgy.链表;

/***
 * @ClassName: StackTest
 * @Description:
 * @Auther: tanggy3
 * @Date: 20:47 2022/7/5
 * @version : V1.0
 */
//定义类管理节点
public class StackTest {
    public StackTest(Node head) {
        this.head = head;
    }

    public StackTest() {
    }

    //初始化一个头节点
    private Node head = new Node(0, "");
    //添加节点,无顺序的

    /**
     * 1、找到当前链表的最后节点，
     * 2、将最后这个节点的next 指向这个新的节点
     */
    public void add(Node node) {
        /** 因为头节点不能动，所以需要一个零时变量来辅助 **/
        Node temp = head;
        while (temp.nextNode != null) {
            temp = temp.nextNode;
        }
        temp.nextNode = node;
    }

    //智能添加，按照数字顺序，如果有已经存在排名就报错
    public void aiAdd(Node node) {
        /** 因为头节点不能动，所以需要一个零时变量来辅助 **/
        Node temp = head;
        boolean flag = false;//编号是否存在
        while (temp.nextNode != null) {
            //满足条件就把node加到temp后面
            if (temp.nextNode.no > node.no) {
                //temp.nextNode= node;
                break;
            } else if (temp.nextNode.no == node.no) {
                flag = true;
                System.out.println("编号已经存在");
            }
            if (flag) break;
            temp = temp.nextNode;
        }
        if (!flag) {
            node.nextNode = temp.nextNode;
            temp.nextNode = node;
        }

    }

    //遍历单链表
    public void show() {
        Node temp = head;
        if (head.nextNode == null) {
            System.out.println("链表为空");
            return;
        }
        while (temp.nextNode != null) {
            temp = temp.nextNode;
            System.out.println(temp);
        }
    }

    //修改节点信息
    public void upd(Node node) {
        if (head.nextNode == null) {
            System.out.println("链表为空");
            return;
        }
        Node temp = head;
        boolean flag = false;
        while (temp.nextNode != null) {
            if (temp.no == node.no) {
                flag = true;
                break;
            }
            temp = temp.nextNode;
        }
        if (flag) {
            temp.name = node.name;
        } else {
            System.out.printf("更新的%d账号不存在\n", node.no);
        }
    }

    //删除节点
    public void del(Node node) {
        if (head.nextNode == null) {
            System.out.println("链表为空");
            return;
        }
        Node temp = head;
        boolean flag = false;
        //temp 为要删除节点的上一个节点
        while (temp.nextNode != null) {
            if (temp.nextNode.no == node.no) {
                flag = true;
                break;
            }
            temp = temp.nextNode;
        }
        if (flag) {
            //把要删除节点的上一个节点的，下指针指向删除节点的下一个节点
            temp.nextNode = temp.nextNode.nextNode;
        } else {
            System.out.printf("删除的%d账号不存在\n", node.no);
        }
    }

    //有效节点个数
    public int currentSize() {
        int size = 0;
        Node temp = head;
        while (temp.nextNode != null) {
            size++;
            temp = temp.nextNode;
        }
        return size;
    }


    //查询单链表中的倒数第k个节点,自己的思路
    public Node getLastNodeByIndex1(int k) {
        if (k < 0) {
            System.out.println("输入有误");
            return null;
        }
        //获取总的节点数
        int i = currentSize();
        if (k > i) {
            System.out.println("没有那么多节点");
            return null;
        }
        Node temp = head;
        for (int l = 0; l <= i - k; l++) {
            temp = temp.nextNode;
        }
        return temp;

    }

    //双指针
    public Node getLastNodeByIndex2(int k) {
        if (k < 0) {
            System.out.println("输入有误");
            return null;
        }
        //获取总的节点数
        int i = currentSize();
        if (k > i) {
            System.out.println("没有那么多节点");
            return null;
        }

        //当index到末尾时候，index就到指定位置了
        int indexTrue = 0;
        int index = indexTrue + k - 1;


        Node temp = head;
        for (int l = 0; l < (k - 1); l++) {
            temp = temp.nextNode;
        }
        return temp;

    }

    //反转单链表
    public Node resverNode(Node inNode) {
        Node node = new Node();
        return node;
    }

    ;

    //获得链表
    public Node getNode() {
        return this.head;
    }

}
